/***************************************************
> Copyright (C) 2024 ==KINGYI== All rights reserved.
> File Name: send.c
> Author:cjy
> Mail: 
> Created Time: 2024年08月06日 星期二 22时26分11秒
***************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h> 
#include <signal.h>

// 定义用户信息结构体
typedef struct use_info {
    int key;
    char txt[100]; // 用户文本
} USE;

// 定义消息结构体
struct msgbuf {
    long mtype;   // 消息类型
    char mtext[200]; // 消息文本
};

// 信号处理函数
void fun(int sig) {
    char path[50] = {0};
	key_t key = 0;//消息队列标识符
	int msgid = 0;//消息队列 ID
	int ret = 0; // 函数返回值
	printf("请输入路径:");
	scanf("%s",path);
	
	key = ftok(path,1);// 使用 ftok 生成一个唯一的 key
	if (key == -1){
		perror("ftok");
		exit(-1);	
	}
	
	msgid = msgget(key,IPC_CREAT | 0666); // 创建或获取消息队列
	if (msgid == -1){
		perror("msgget");
		exit(-1);	
	}
    ret = msgctl(msgid, IPC_RMID, NULL);
    if (ret == -1) {
        perror("msgctl");  // 输出错误信息
        exit(-1);          // 遇到错误退出程序
    }
    printf("ok");
    printf("杀死进程成功\n"); 
}

int main(int argc, const char* argv[]) {
    signal(SIGINT, fun); // 注册信号处理函数

    char path[50] = {0}; // 存储路径的字符数组
    key_t key = 0;       // 消息队列标识符
    int msgid = 0;       // 消息队列 ID
    int ret = 0;         // 函数返回值

    printf("请输入路径: ");
    scanf("%s", path); // 输入路径

    // 使用 ftok 生成一个唯一的 key
    key = ftok(path, 1);
    if (key == -1) {
        perror("ftok");
        exit(-1);    
    }

    // 创建或获取消息队列
    msgid = msgget(key, IPC_CREAT | 0666);
    if (msgid == -1) {
        perror("msgget");
        exit(-1);    
    }

    // 主循环，用于发送和接收消息
    while (1) {
        // 发送消息
        USE use;
        use.key = key;
        scanf("%s", use.txt);
        if (strcmp(use.txt, "kill") == 0) { // 检查是否输入 "kill"
            raise(SIGINT); // 触发 SIGINT 信号
        }

        struct msgbuf msg;
        msg.mtype = 1; // 设置消息类型
        memcpy(msg.mtext, &use, sizeof(USE)); // 复制用户信息到消息结构体
        ret = msgsnd(msgid, &msg, sizeof(USE), 0);
        if (ret == -1) {
            perror("msgsnd");
            exit(-1);
        }

        // 接收消息
        struct msgbuf data;
        memset(&data, 0, sizeof(struct msgbuf)); // 初始化数据结构
        ret = msgrcv(msgid, &data, sizeof(struct msgbuf) - sizeof(long), 2, 0);
        if (ret == -1) {
            perror("msgrcv");
            exit(-1);          // 遇到错误退出程序
        }

        USE k;
        memcpy(&k, data.mtext, sizeof(USE)); // 复制用户信息
        printf("%d:\n", k.key); // 输出用户键值
        printf("%s\n", k.txt); // 输出用户文本
    }

    return 0;
}

